<?php
/*
ImageEdit Class 0.2 by ming0070913
__construct($src)
resize($maxWidth=0, $maxHeight=0, $holdRatio=true)
addtext($text, $font, $size=10, $angle=0, $x=0, $y=0, $c=array(0,0,0))
	-$x or $y <0 means start from lower right
	-$c=array(r,g,b)
watermark($wm, $x=0, $y=0, $maxWidth=0, $maxHeight=0, $holdRatio=true)
	-$x or $y <0 means start from lower right
effect($effect)
output($type, $dst=NULL, $quality=100)
*/
class ImageEdit
{
	public $src, $image = false, $width, $height, $dstInfo, $type;
	
	public function __construct($src){
		if(!file_exists($src)) return;
		$this->src = $src;
		$info = getImageSize($src);
		$this->width = $info[0];
		$this->height = $info[1];
		switch ($info[2]) {
			case 1: $this->image = @imageCreateFromGif($src); break;
			case 2: $this->image = @imageCreateFromJpeg($src); break;
			case 3: $this->image = @imageCreateFromPng($src); break;
			default: return;
		}
		if(!$this->image) return;
	}
	
	public function resize($maxWidth=0, $maxHeight=0, $holdRatio=true){
		if($maxWidth<=0 && $maxHeight<=0) return false;
		if($holdRatio){
			$srcRatio = $this->width/$this->height;
			$dstRatio = $maxHeight?$maxWidth/$maxHeight:0;
			if($destRatio>$srcRatio || $maxHeight==0){
				$dstWidth = $maxWidth;
				$dstHeight = round($maxWidth/$srcRatio);
			}else{
				$dstWidth = round($maxHeight*$srcRatio);
				$dstHeight = $maxHeight;
			}
		}else{
			$dstHeight = $maxHeight;
			$dstWidth = $maxWidth;
		}
		
		$tmp = imagecreatetruecolor($dstWidth, $dstHeight);
		imagealphablending($tmp, false);
		imagefill($tmp, 0, 0, imagecolorallocatealpha($tmp, 0, 0, 0, 127));
		imagesavealpha($tmp, true);
		
		if(imagecopyresampled($tmp, $this->image, 0, 0, 0, 0, $dstWidth, $dstHeight, $this->width, $this->height)===true){			
			$this->width = $dstWidth;
			$this->height = $dstHeight;
			@imagedestroy($this->image);
			
			$this->image = imagecreatetruecolor($dstWidth, $dstHeight);
			imagealphablending($this->image, false);
			imagefill($this->image, 0, 0, imagecolorallocatealpha($this->image, 0, 0, 0, 127));
			imagesavealpha($this->image, true);
			imagecopy($this->image, $tmp, 0, 0, 0, 0, $dstWidth, $dstHeight);
			@imagedestroy($tmp);
			return true;
		}
		return false;
	}
	
	public function getWidth(){return $this->width;}
	public function getHeight(){return $this->height;}

	public function addtext($text, $font, $size=10, $angle=0, $x=0, $y=0, $c=array(0,0,0)/*array(r,g,b)*/){
		$bbox = imageftbbox($size, $angle, $font, $text);
		return @imagefttext($this->image, $size, $angle,
			(($x>=0)?($x-$bbox[6]):($x+$this->width+$bbox[6]-$bbox[4])),
			(($y>=0)?($y-$bbox[7]):($y+$this->height+$bbox[7]-$bbox[5]-5)), 
			imagecolorallocate($this->image, $c[0], $c[1], $c[2]),
			$font, $text);
	}
	
	public function watermark($wm, $x=0, $y=0, $maxWidth=0, $maxHeight=0, $holdRatio=true){
		$wm = new ImageEdit($wm);
		if(!is_resource($wm->image)) return false;
		if($maxWidth>0 || $maxHeight>0) $wm->resize($maxWidth, $maxHeight, $holdRatio);
		$x = (int) ($x>=0)?$x:($this->width+$x-$wm->width);
		$y = (int) ($y>=0)?$x:($this->height+$y-$wm->height);
		
		imagelayereffect($this->image, IMG_EFFECT_ALPHABLEND);
		
		return imagecopy($this->image, $wm->image, $x, $y, 0, 0, $wm->width, $wm->height);
	}
	
	public function effect($effect){
		switch(strtoupper($effect)){
			case "BLUR": $matrix = array(array(1/9,1/9,1/9),array(1/9,1/9,1/9),array(1/9,1/9,1/9)); break;
			case "EDGE": $matrix = array(array(0,-1,0),array(-1,4,-1),array(0,-1,0)); break;
			case "SHARPENA": $matrix = array(array(0,-1,0),array(-1,5,-1),array(0,-1,0)); break;
			case "SHARPENB": $matrix = array(array(-1,-1,-1),array(-1,16,-1),array(-1,-1,-1)); break;
			case "EMBOSS": $matrix = array(array(2,0,0),array(0,-1,0),array(0,0,-1)); break;
			case "LIGHT": $matrix = array(array(0,0,1),array(0,1,0),array(1,0,0)); break;
			default: return false; break;
		}
		return @imageconvolution($this->image, $matrix, 1,0);
	}
	
	public function output($type, $dst=NULL, $quality=100){
		$type = strtoupper($type);
		if($dst!=NULL){
			switch($type){
				case "JPG": case "JPEG": return @imageJpeg($this->image, $dst, $quality);
				case "PNG": return @imagePng($this->image, $dst);
				case "GIF": return @imageGif($this->image, $dst);
				default: return false;
			}
		}else{
			switch($type){
				case "JPG": case "JPEG":
					header('Content-type: image/jpeg');
					return @imageJpeg($this->image, NULL, $quality);
				case "PNG":
					header('Content-Type: image/png');
					return @imagePng($this->image);
				case "GIF":
					header('Content-type: image/gif');
					return @imageGif($this->image);
				default: return false;
			}
		}
		//@imagedestroy($this->image);
		//return $ok;
	}
}
?>